////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2016-2017 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file camxdefs.h
///
/// @brief CamX common definitions
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef CAMXDEFS_H
#define CAMXDEFS_H

#include "camxtypes.h"

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Constants
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const UINT64 NanoSecondsPerSecond = 1000000000ULL;

const UINT TimeoutMilliseconds = 1000;

/// @brief Define invalid requestId
static const UINT CamxInvalidRequestId = 0;

/// @brief Define invalid stream Id
static const UINT CamxInvalidStreamId = 0xBEEFCAFE;

/// @brief Used to detect region/buffer overruns
static const UINT CamxCanary = 0x43216789;

/// @brief Maximum device index count
static const UINT CamxMaxDeviceIndex = 16;

/// @brief Maximum number of different node types
const UINT MaxNodeType = 16;

/// @brief Max pipelines per session
static const UINT32 MaxPipelinesPerSession  = 16;

/// @brief Max string length
static const UINT32 MaxStringLength64 = 64;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Macros
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/// @brief Helper for CamX namespace
// NOWHINE CP011: We're defining the macro
#define CAMX_NAMESPACE_BEGIN namespace CamX {

/// @brief Helper for CamX namespace
#define CAMX_NAMESPACE_END }

/// @brief A hint to the compiler that inlining is desired.
#define CAMX_INLINE __inline

/// @brief Ensures a function is inlined where supported. Use with care.
#if defined(__GNUC__)
#define CAMX_INLINE_FORCE __attribute__((always_inline))
#else
#define CAMX_INLINE_FORCE
#endif // __GNUC__

/// @brief Data structures that are directly accessed by HW must be packed to have the expected layout expected. Use a
///        platform-independent macro for this purpose.
#if defined(__GNUC__)
#define CAMX_PACKED                  __attribute__((__packed__))
#define CAMX_BEGIN_PACKED
#define CAMX_PACKED_ALIGN_N(N)       __attribute__((packed, aligned(N)))
#define CAMX_BEGIN_PACKED_ALIGN_N(N)
#define CAMX_END_PACKED
#else
#define CAMX_PACKED
#define CAMX_BEGIN_PACKED   \
    __pragma(pack(push, 1))
#define CAMX_BEGIN_PACKED_ALIGN_N(N)    \
    __pragma(pack(push, N))
#define CAMX_END_PACKED     \
    __pragma(pack(pop))
#define CAMX_PACKED_ALIGN_N(N)
#endif // defined(__GNUC__)

#if defined(__GNUC__)
#define CAMX_VISIBILITY_PUBLIC __attribute__ ((visibility ("default")))
#define CAMX_VISIBILITY_LOCAL  __attribute__ ((visibility ("hidden")))
#else
#define CAMX_VISIBILITY_PUBLIC __declspec(dllexport)
#define CAMX_VISIBILITY_LOCAL
#endif // defined(__GNUC__)

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// CAMX_ARRAY_SIZE
///
/// @brief Calculates the number of elements in an array
///
/// @param array The array to count the elements of
///
/// @return The number of elements in the array
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define CAMX_ARRAY_SIZE(array) (sizeof((array)) / sizeof((array)[0]))

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// CAMX_ARRAY_COLS
///
/// @brief Calculates the number of columns in a 2D array
///
/// @param array The array to count the elements of
///
/// @return The number of elements in the array
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define CAMX_ARRAY_COLS(array) (sizeof((array)[0]) / sizeof((array)[0][0]))

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// CAMX_ARRAY_ROWS
///
/// @brief Calculates the number of rows in a 2D array
///
/// @param array The array to count the elements of
///
/// @return The number of elements in the array
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define CAMX_ARRAY_ROWS(array) CAMX_ARRAY_SIZE(array)

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// CAMX_STRINGIZE
///
/// @brief Stringize helper
///
/// @param arg Argument to stringize
///
/// @return Stringized arg
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define CAMX_STRINGIZE(arg) #arg

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// CAMX_STRINGIZE_MACRO
///
/// @brief Macro stringize helper
///
/// @param arg Argument to macro expand and stringize
///
/// @return Stringized expansion of arg
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define CAMX_STRINGIZE_MACRO(arg) CAMX_STRINGIZE(arg)

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// CAMX_UNREFERENCED_PARAM
///
/// @brief Unreferenced macro helper
///
/// @param param The unreferenced parameter.
///
/// @return void
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define CAMX_UNREFERENCED_PARAM(param) (void)param

#endif // CAMXDEFS_H
